// CommonJS模块
let { stat } = require('fs');
//上面代码的实质是整体加载fs模块（即加载fs的所有方法），生成一个对象（_fs），然后再从这个对象上面读取方法。这种加载称为“运行时加载”

// ES6模块
import { exists, readFile } from 'fs';
//上面代码的实质是从fs模块加载方法，其他方法不加载。这种加载称为“编译时加载”，即ES6可以在编译时就完成模块加载，效率要比CommonJS模块的加载方式高。当然，这也导致了没法引用ES6模块本身，因为它不是对象
//但实际webpack打包后，就算你只引用lib.js文件里的一个export接口，打包出来的app.js会有该lib.js文件所有export接口的,毕竟不是真正的ES6 模块,Babel是转成ES5的CommonJS模块的,所以我们写的时候，还是分散点写。
//注意import进来的变量不要重名 

//可以用as重命名 import export 都适用
import { lastName as surname } from './profile'; //注意可以省略.js


//import命令具有提升效果，会提升到整个模块的头部，首先执行。
foo();
import { foo } from 'my_module';


//TODO import语句会执行所加载的模块，因此可以有下面的写法。
//import 'lodash'; //执行lodash模块, 经实验,使用webpack打包后,不行啊


//另: 也可以使用require(), 写法像下面这样: react react-dom 内部是这样实现的
module.exports = function() {
    alert('use module exports in loadsh');
}
var sh = require('.loadsh');
sh(); //show alert


// 一些易错点  
{
//  export var block = 1; //export import 必须处于最外层
}

var m = 1;
//export命令规定的是对外的接口，必须与模块内部的变量建立一一对应关系
//export 1; //只是输出变量1,没有接口名
//export m; //m代表变量1, 仍是没有接口名
export {m}; //本质是{m:m}, 有接口名,有模块内部变量名 编译后是 exports.m = m; 
//这样也是对的,不过不推荐
export var m = 1; //编译后是 var m = exports.m = 1;

// 函数类似
function f() {}
// export f; // 报错
export function f(){}; 
export {f}; //最好这样写啦

//export default就是输出一个叫做default的变量或方法，然后系统允许你在import时为它取任意名字

//它后面不能跟变量声明语句。
// 正确
export var a = 1;

// 正确
var a = 1;
export default a;

// 错误
//export default var a = 1;


//记住, {} 与 default 的区别:

//如果是import React, 去看看源码,它并非export {React} , 
// 而是module.exports = React, 这种应该类似 export default React;
// console.log(React) 编译后:
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
console.log(_react2.default);

//如果是 import {Test}, 前提是 export {Test}; 
//console.log(Test)  编译后:
var _test = require('./test');
console.log(_test.Test);

//实际应用: 对应React这些类库, 应该 import React from 'react'; 不带 {}, 否则编译后代码为 _react.React //undefined 无法正确执行


// 跨常量 constants.js 模块, 导出
export const A = 1;
export const B = 3;
export const C = 4;

//导入
// test1.js 模块
import * as constants from './constants';

// test2.js 模块
import {A, B} from './constants';
